// 引入数据库
const DB = wx.cloud.database();
//骑行记录数据库
const ridedb = DB.collection("CarRide");
//跑步数据库
const rundb = DB.collection("CarRun");
//行走数据库
const walkdb = DB.collection("CarWalk");
// 消息数据库 用于提示跑步信息
const msgManage = DB.collection("MsgManage");

// 声明时间变量
var getTime=new Date()

// 这一堆是百度的
var countTooGetLocation = 0;
var total_micro_second = 0;
var starRun = 0;
var totalSecond  = 0;
var oriMeters = 0.0;

//按键切换
var btnCd = false;

// 分钟数
var timeMin = ""

//全局用时 时间点
var useTime = "";
//公里数
var showMeters = "0.00";
//卡路里
var consumeCal = "0.00";

//全局定时器
var timeId = 0;

//模式 用于获得不同页面带来的跑步 步行 骑行参数
var mode = "";
/* 毫秒级倒计时 */
function count_down(that) {
  // console.log(starRun)
  // 按键切换 开始 暂停 结束 
  if (starRun == 0) {//结束跑步
    countTooGetLocation = 0;
    total_micro_second = 0;
    return;
  }

  // starRun  1 暂停
  else if (starRun == 1) {//暂停跑步
    return;
  }
  else{
    // 用于更新地图
    if (countTooGetLocation >= 100) {
      var time = date_format(total_micro_second);
      that.updateTime(time);
    }
    // 用于界面 用时的时间显示计时 
  	if (countTooGetLocation >= 5000) { //1000为1s
        that.getLocation();
        countTooGetLocation = 0;
  	}   
    // 定时器控制整个界面时间点 例如 时间刷新 卡路里值刷新 配速刷新 没有该定时器 界面的数据不会流动
    timeId = setTimeout(function(){
		countTooGetLocation += 10;
    total_micro_second += 10;
    count_down(that);
    // console.log(timeId)
    }
    ,10
    )
  }
    
}


// 时间格式化输出，如03:25:19 86。每10ms都会调用一次
function date_format(micro_second) {
  	// 秒数
  	var second = Math.floor(micro_second / 1000);
  	// 小时位
  	var hr = Math.floor(second / 3600);
  	// 分钟位
  	var min = fill_zero_prefix(Math.floor((second - hr * 3600) / 60));
  	// 秒位
	  var sec = fill_zero_prefix((second - hr * 3600 - min * 60));// equal to => var sec = second % 60;

  timeMin = min
  // 返回时分秒格式给予“用时”显示
	return hr + ":" + min + ":" + sec + " ";
}


function getDistance(lat1, lng1, lat2, lng2) { 
    var dis = 0;
    var radLat1 = toRadians(lat1);
    var radLat2 = toRadians(lat2);
    var deltaLat = radLat1 - radLat2;
    var deltaLng = toRadians(lng1) - toRadians(lng2);
    var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
    return dis * 6378137;

    function toRadians(d) {  return d * Math.PI / 180;}
} 

function fill_zero_prefix(num) {
	return num < 10 ? "0" + num : num
}

//****************************************************************************************
//****************************************************************************************

Page({
  // 初始化数据
  data: {
    // 配速
    SPEED : "0.00",
    CTRLSTY:"cuIcon-playfill",
    clock: '',
    isLocation:false,
    // 纬度
    latitude: 0,
    // 经度
    longitude: 0,
    // 地图数据
    covers: [],
    // 公里数
    meters: 0.00,
    // 用时时间
    time: "0:00:00",
    // 轨迹绘制
    polyline: [{
      // 绘制点
      points: [],
      // 点连成线的颜色
      color: "#42a4ff",
      // 线宽
      width: 3,
      // 允许划线
      arrowLine: true
    }],
  },

//****************************
  onLoad:function(options){
    
    this.getLocation()
    console.log("onLoad")
    count_down(this);
    // 页面初始化 options为页面跳转所带来的参数
    // 解析上一个界面带来的参数 mode 包含跑步界面 步行界面 骑行界面参数
    // 将mode声明为全局变量 方便数据库的选择存储
    mode = options.mode
  },


//****************************
  starRun :function () {
    let that = this
    // 按键取反 状态切换 开始变化暂停 暂停变化继续切换
    btnCd = !btnCd

    if(btnCd == true){
      // 如果按键被点击 界面的图标发生改变
      that.setData({
        CTRLSTY : "cuIcon-stop"
      })
      starRun = 2;
      // 切换运动状态 时间开始计时 轨迹开始绘制
      count_down(this);
      this.getLocation();
    }
    else{
      // 切换图标
      that.setData({
        CTRLSTY : "cuIcon-playfill"
      })
      // 暂停跑步
      starRun = 1;
      count_down(this);
    }
  },


 //****************************
  stopRun:function () {
    // 时间获取 获取的时间作为消息数据库的变量存储
    let month = getTime.getMonth()
    month += 1
    let dayNum = getTime.getDate()
    // 时间格式化
    let showTime = month+"月" + dayNum + "号" + getTime.getHours() + ":" + getTime.getMinutes()

    let that = this
    // 停止标志位
    starRun = 0;
    // 调用切换函数
    count_down(this);
    btnCd = false
    // 数据库数据添加
    if(mode == "run"){
      wx.showModal({
        title: '提示',
        content: '是否停止跑步',
        success (res) {
          if (res.confirm) {
            // 跑步数据库信息添加 用于在相应界面展示运动记录 以下2个同理 不做介绍
            rundb.add({
              data:{
                meters : showMeters,
                time : useTime,
                cal : consumeCal
              }
            })
            // 往消息数据库添加信息 在消息界面就可以看到运动通知
            msgManage.add({
              data:{
                // 消息类型
                type : "运动通知",
                // 消息内容
                clockin : "跑步记录已经更新，可以通过记录查看！！！",
                // 消息图片
                img:"https://7864-xdaisqliot-1g4ucqpdcb12b67a-1304264748.tcb.qcloud.la/lossPlanIcon/icon/%E8%BF%90%E5%8A%A8%E5%81%A5%E5%BA%B7.png?sign=79bc82f52b4ce4b87111f5b56147b3f5&t=1646978108",
                // 消息时间
                date:showTime
              }
            })
            wx.navigateTo({
              url: '/pages/run/run',
            })
            
          } 
          else if (res.cancel) {
            // console.log('用户点击取消')
          }
        }
      })
    }
    //行走
    else if(mode == "walk"){
      wx.showModal({
        title: '提示',
        content: '是否停止行走',
        success (res) {
          if (res.confirm) {
            walkdb.add({
              data:{
                meters : showMeters,
                time : useTime,
                cal : consumeCal
              }
            })
            msgManage.add({
              data:{
                type : "运动通知",
                clockin : "行走记录已经更新，可以通过记录查看！！！",
                img:"https://7864-xdaisqliot-1g4ucqpdcb12b67a-1304264748.tcb.qcloud.la/lossPlanIcon/icon/%E8%BF%90%E5%8A%A8%E5%81%A5%E5%BA%B7.png?sign=79bc82f52b4ce4b87111f5b56147b3f5&t=1646978108",
                date:showTime
              }
            })
            wx.navigateTo({
              url: '/pages/walk/walk',
            })
            
          } 
          else if (res.cancel) {
            // console.log('用户点击取消')
          }
        }
      })
    }
    //骑行
    else if(mode == "ride"){
      wx.showModal({
        title: '提示',
        content: '是否停止骑行',
        success (res) {
          if (res.confirm) {
            ridedb.add({
              data:{
                meters : showMeters,
                time : useTime,
                cal : consumeCal
              }
            })
            msgManage.add({
              data:{
                type : "运动通知",
                clockin : "骑行记录已经更新，可以通过记录查看！！！",
                img:"https://7864-xdaisqliot-1g4ucqpdcb12b67a-1304264748.tcb.qcloud.la/lossPlanIcon/icon/%E8%BF%90%E5%8A%A8%E5%81%A5%E5%BA%B7.png?sign=79bc82f52b4ce4b87111f5b56147b3f5&t=1646978108",
                date:showTime
              }
            })
            wx.navigateTo({
              url: '/pages/ride/ride',
            })
            
          } 
          else if (res.cancel) {
            // console.log('用户点击取消')
          }
        }
      })
      
    }


   //点击结束允许 全部变量复位回到一开始的状态 数据绑定 渲染wxml页面数据
    that.setData({
      CTRLSTY : "cuIcon-playfill",
      meters: 0.00,
      time: "0:00:00",
      cCal : "0",
      SPEED : 0
    })
  },


//****************************
  updateTime:function (time) {
    let that = this
    useTime = time
    // 更新界面时间显示
    this.setData ({
      time : useTime,
      
    })

  },


//*******该函数为该页面核心函数 用于获取用户坐标地图显示 轨迹描绘
  getLocation:function () {
    var that = this
    wx.getLocation({
      type: 'gcj02', // 默认为 wgs84 返回 gps 坐标，gcj02 返回可用于 wx.openLocation 的坐标
      success: function(res){
        //得到用户经纬度 由手机GPS提供
        var newCover = {
            latitude: res.latitude,
            longitude: res.longitude,
            // iconPath: '/resources/redPoint.png',
          };
        var oriCovers = that.data.covers;
        
        // 运动距离变量 用于绘制轨迹图
        var len = oriCovers.length;
        var lastCover;
        if (len == 0) {
          oriCovers.push(newCover);
        }
        len = oriCovers.length;
        var lastCover = oriCovers[len-1];
        
        // 得到新的坐标点 按照1000比例缩放
        var newMeters = getDistance(lastCover.latitude,lastCover.longitude,res.latitude,res.longitude)/1000;
        // 运动距离小 忽略不计
        if (newMeters < 0.0015){
            newMeters = 0.0;
        }

        // 获取总运动距离
        oriMeters = oriMeters + newMeters; 
        // 配速计算
        // 1分钟测量法
        // 公式 V=60S(60:分钟 S:距离) 
        // 案例:一分钟50米 V=60*50=3公里/小时
        let speed = newMeters * 60;
        // toFixed()保留小数位
        speed = speed.toFixed(2);
        // 总运动公里数
        var metersValue = new Number(oriMeters);
        showMeters = metersValue.toFixed(2);
        // 重点1 跑步卡路里计算公式:
        // 简易公式一：
        //    跑步热量（kcal）＝体重（kg）×距离（公里）×1.036
        // 案例:  如果一个70kg的成年人跑5公里，所消耗的热量大约为362.6千卡。
        // 简易公式二：
        //    跑步热量（kcal）＝ 体重（kg）× 运动时间（分钟）× 指数K
        // 案例:  一小时8公里 K＝0.1355，一小时12公里 K＝0.1797，一小时15公里 K＝0.1875。
        if(mode == "run"){
          // 这里选用公式一 按照60Kg再来计算
          consumeCal =  60 * showMeters *1.036
          consumeCal = consumeCal/1000
          // toFixed(3)保留3位小数 以下2个相同 不做介绍
          consumeCal = consumeCal.toFixed(3)
        }
        //重点2 行走卡路里消耗公式 
        // 消耗热量=克服地面摩擦力做功=m(质量)g()k(摩擦系数)*s(距离)
        // 案例:  （假设脚底与地面平均摩擦系数k为0.5，水平行走10km）
        // 80(质量)*10(g系数)*0.5(摩擦系数)*10*1000(10*1000就是10公里)=400万（焦耳）=957（kcal）
        else if(mode == "walk"){
          // 行走卡路里消耗公式
          consumeCal = 60 * 10 * 0.5 * showMeters
          consumeCal = consumeCal/1000
          consumeCal = consumeCal.toFixed(3)
        }
        //重点3 骑行卡路里消耗公式
        // 消耗的卡路里（kcal）= 时速(km/h)×体重(kg)×1.05×运动时间(h) 
        // 时速计算方式 一分钟测量法 V=60S
        // 案例:  一分钟50米 
        // V=60(分钟)*50(米)=3公里/小时(预计)
        else if(mode == "ride"){
          // 骑行卡路里消耗公式
          consumeCal = speed * 60 * 1.05 * (timeMin / 60)
          consumeCal = consumeCal/1000
          consumeCal = consumeCal.toFixed(3)
        }
        else{

        }
        //地图轨迹图描绘
        // 通过push方法给数组添加运动点
        oriCovers.push(newCover);
        // 数据绑定 改变wxml界面的经纬度 以及polyline[0].points点连线
        that.setData({
          latitude: res.latitude,
          longitude: res.longitude,
          // 轨迹图绘制
          ["polyline[0].points"] : oriCovers,
          // 公里数显示
          meters:showMeters,
          // 卡路里显示
          cCal : consumeCal,
          // 配速显示
          SPEED : speed
        });
      },
    })
  },
  onPullDownRefresh:function(){
    this.getLocation()
    wx.stopPullDownRefresh()
  },
  // 页面定时器清除 避免再次进入造成定时器混乱
  onUnload:function(){
    let that = this
    that.stopRun()
    // console.log(timeId)
    //防止页面多次载入 时间加速   
    clearTimeout(timeId)
  }
  
})


